// export const person: string = 'null';
// 这是一段注释文字
// const jspang: string = 'null';
// export const name = "jspang";

// function fn(i: string) {
//   console.log('i', i)
// }
// fn('fnparams')


// 类型保护
// interface Waiter {
//   anjiao: boolean;
//   say: () => {};
// }

// interface Teacher {
//   anjiao: boolean;
//   skill: () => {};
// }

// function judgeWho(animal: Waiter | Teacher) {
//   if (animal.anjiao) {
//     (animal as Teacher).skill()
//   } else {
//     (animal as Waiter).say()
//   }
// }

// function judgeTwo(animal: Waiter | Teacher) {
//   if ("skill" in animal) {
//     animal.skill();
//   } else {
//     animal.say();
//   }
// }

// function add(first: string | number, second: string | number) {
//   if (typeof first === "string" || typeof second === "string") {
//     return `${first}${second}`;
//   }
//   return first + second;
// }

// class NumberObj {
//   constructor(public count: number) {}
// }

// function addObj(first: object | NumberObj, second: object | NumberObj) {
//   if (first instanceof NumberObj && second instanceof NumberObj) {
//     return first.count + second.count;
//   }
//   return 0
// }
// const a = new NumberObj(1)
// const b = new NumberObj(2)

// console.log(addObj(a, b))


// 枚举
// enum Status {
//   MASSAGE,
//   SPA,
//   DABAOJIAN
// }
// console.log(Status.DABAOJIAN, Status[2])

// 泛型
// function myFun<ANY>(params: ANY[]) {
//   return params;
// }
// console.log(myFun<string>(["123", "456"]))
// function join<Fanxian>(first: Fanxian, second: Fanxian) {
//   return `${first}${second}`;
// }
// console.log(join<number>(1, 2))

// function join1<T, P>(first: T, second: P) {
//   return `${first}${second}`;
// }
// console.log(join1<number,string>(1, "2"))
// console.log(join1(4, "6"))

// class中泛型
// class SelectBoy<T> {
//   constructor(private boys: T[]) {}
//   getBoy(index: number): T {
//     return this.boys[index]
//   }
// }

// const selectBoy = new SelectBoy<string>(['one', 'two', 'three'])
// console.log(selectBoy.getBoy(2))

interface Boy {
  name: string;
}
class SelectBoy<T extends Boy> {
  constructor(private boys: T[]) {}
  getBoy(index: number): string {
    return this.boys[index].name;
  }
}
const selectGirl = new SelectBoy([
  { name: "dage" },
  { name: "erge" },
  { name: "sandi" },
]);
console.log(selectGirl.getBoy(1));